/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package game;

import framework.GameObject;
import framework.Key;
import framework.Screen;
import framework.Util;
import framework.gameAPI.Sprite;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;

/**
 *
 * @author edilson
 */
public class Inimigo extends GameObject {

    private int cont;
    private boolean ativo;
    private Sprite sprite;
    private static final int[] ANIM_INIMIGO1_MOVE = {6};
    private static final int[] ANIM_INIMIGO1_DEAD = {7, 8};
    private static final int[] ANIM_INIMIGO2_MOVE = {9};
    private static final int[] ANIM_INIMIGO2_DEAD = {10, 11};
    private static final int[] ANIM_INIMIGO3_MOVE = {0, 1, 2, 3};
    private static final int[] ANIM_INIMIGO3_DEAD = {4, 5};
    private static final int[] ANIM_ALL_DEAD = {12, 13, 15, 17, 19};
    private int state;
    public static final int STATE_MOVING = 0;
    public static final int STATE_INIT_DYING = 1;
    public static final int STATE_FINAL_DYING = 2;
    public static final int STATE_DEAD = 3;
    private int tipo;
    public static final int TIPO1 = 0;
    public static final int TIPO2 = 1;
    public static final int TIPO3 = 2;
    int initPower;

    private int indiceBombas;

    public Inimigo(int tipo) {

        this.image = Util.loadImage(Global.IMG_INIMIGOS);
        sprite = new Sprite(image, 50, 50);
        sprite.setAnimationDelay(5);
        state = STATE_MOVING;

        this.indiceBombas = 1000;

        this.tipo = tipo;
        switch (tipo) {
            case TIPO1:
                sprite.setFrameSequence(ANIM_INIMIGO1_MOVE);
                this.width = 40;
                this.height = 44;
                this.power = 8;
                break;
            case TIPO2:
                sprite.setFrameSequence(ANIM_INIMIGO2_MOVE);
                this.width = 27;
                this.height = 32;
                this.power = 6;
                break;
            case TIPO3:
                sprite.setFrameSequence(ANIM_INIMIGO3_MOVE);
                this.width = 45;
                this.height = 42;
                this.power = 10;
                break;
        }

        cont = 0;

        this.x = 0;
        this.y = 0;
//        this.width = image.getWidth(null);
//        this.height = image.getHeight(null);
        speedX = 2;
        speedY = 10;
        ativo = false;
        initPower = this.power;
    }

    @Override
    public void update() {

        switch (state) {
            case STATE_MOVING:
                if (tipo == TIPO1) {
                    updateTipo1();
                    if (power <= 0) {
                        state = STATE_INIT_DYING;
                        sprite.setFrameSequence(ANIM_INIMIGO1_DEAD);
                    }


                } else if (tipo == TIPO2) {
                    updateTipo2();
                    if (power <= 0) {
                        state = STATE_INIT_DYING;
                        sprite.setFrameSequence(ANIM_INIMIGO2_DEAD);
                    }
                } else if (tipo == TIPO3) {
                    updateTipo3();
                    if (power <= 0) {
                        state = STATE_INIT_DYING;
                        sprite.setFrameSequence(ANIM_INIMIGO3_DEAD);
                    }
                }
                // movendo a nave
                x += speedX;
                y += speedY;
                break;
            case STATE_INIT_DYING:
                sprite.setAnimationDelay(5);
                if (sprite.animationEnded()) {
                    state = STATE_FINAL_DYING;
                    sprite.setFrameSequence(ANIM_ALL_DEAD);
                }
                break;

            case STATE_FINAL_DYING:
                sprite.setAnimationDelay(1);
                if (sprite.animationEnded()) {
                    state = STATE_DEAD;
                }
                break;
            case STATE_DEAD:
                setVisible(false);
                break;
        }

    }

    private void updateTipo1() {
        if (!ativo) {
            //anda reto para baixo
            speedX *= -1;
            //speedY = 12;
            //verifica se está no campo de batalha
            if (y > 50) {
                ativo = true;
                speedX = 6;
                speedY = 10;
            }
        }
        //se está no campo de batalha
        if (ativo) {

            if (y > 350) {
                speedX = 6;
                speedY = 0;
            }
            if (x > Screen.getWidth() - 50) {
                speedX = 0;
                speedY = -3;
            }

            if (y < 0) {
                speedX = -4;
                speedY = 0;
            }
            if (x < 10) {
                speedY = 8;
                speedX = 3;
            }
        }
    }

    private void updateTipo2() {
        if (!ativo) {
            //anda reto para baixo
            speedX *= -1;
            //speedY = 12;
            //verifica se está no campo de batalha
            if (y > 0) {
                ativo = true;
                speedX = 2;
                speedY = 6;
            }
        }
        if (ativo) {
            if (y > 300 || y <= 0) {
                speedY *= -1;
            }
        }
        if (x > Screen.getWidth() || x < 0) {
            speedX *= -1;
        }
    }

    private void updateTipo3() {
        if (!ativo) {
            //anda reto para baixo
            speedX *= -1;
            //speedY = 12;
            //verifica se está no campo de batalha
            if (y > 0) {
                ativo = true;
                speedX = 6;
                speedY = 1;
            }
        }
        if (ativo) {
            if (y > Screen.getHeight() || y <= 0) {
                y = 0;
            }
        }
        if (x > Screen.getWidth() || x < 0) {
            speedX *= -1;
        }
    }

    public void paint(Graphics g) {
        int largura =(this.getWidth()/initPower)*this.power;
        if (visible) {
            sprite.setX(x);
            sprite.setY(y);
            sprite.paint(g);
//            g.setColor(Color.yellow);
//            g.drawRect(x, y + 5, this.getWidth(), 1);
            g.setColor(Color.GREEN);
            g.fillRect(getWidth()-largura+x, y + 5, largura, 3);

        }

    }

    public boolean isAtivo() {
        return ativo;
    }

    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }

    public int getState() {
        return state;
    }

    public int getIndiceBombas() {
        return indiceBombas;
    }

    public void setIndiceBombas(int indiceBombas) {
        this.indiceBombas = indiceBombas;
    }

    
}
